/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.kedacom.demo.jsch;

import com.jcraft.jsch.ChannelSftp;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author xiaojinghai
 */
public class SFTPTest {

    public SFTPChannel getSFTPChannel() {
        return new SFTPChannel();
    }

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        SFTPTest test = new SFTPTest();

        Map<String, String> sftpDetails = new HashMap<String, String>();
        // 设置主机ip，端口，用户名，密码
        sftpDetails.put(SFTPConstans.SFTP_REQ_HOST, "172.16.217.211");
        sftpDetails.put(SFTPConstans.SFTP_REQ_USERNAME, "root");
        sftpDetails.put(SFTPConstans.SFTP_REQ_PASSWORD, "itserver");
        sftpDetails.put(SFTPConstans.SFTP_REQ_PORT, "22");

        String src = "F:\\jdk-7u40-windows-i586.exe"; // 本地文件名
        String dst = "/home/jdk-7u40-windows-i586.exe"; // 目标文件名

        SFTPChannel channel = test.getSFTPChannel();
        ChannelSftp chSftp = channel.getChannel(sftpDetails, 60000);

        /**
         * 代码段1 OutputStream out = chSftp.put(dst, ChannelSftp.OVERWRITE); //
         * 使用OVERWRITE模式 byte[] buff = new byte[1024 * 256]; //
         * 设定每次传输的数据块大小为256KB int read; if (out != null) {
         * System.out.println("Start to read input stream"); InputStream is =
         * new FileInputStream(src); do { read = is.read(buff, 0, buff.length);
         * if (read > 0) { out.write(buff, 0, read); } out.flush(); } while
         * (read >= 0); System.out.println("input stream read done."); }
         *
         */
        chSftp.put(src, dst, ChannelSftp.OVERWRITE); // 代码段2

        // chSftp.put(new FileInputStream(src), dst, ChannelSftp.OVERWRITE); // 代码段3

        chSftp.quit();
        channel.closeChannel();


        /**
         * 实现文件上传可以调用ChannelSftp对象的put方法。ChannelSftp中有12个put方法的重载方法：
         *
         * public void put(String src, String dst)
         * 将本地文件名为src的文件上传到目标服务器，目标文件名为dst，若dst为目录，则目标文件名将与src文件名相同。
         *
         * 采用默认的传输模式：OVERWRITE
         *
         * public void put(String src, String dst, int mode)
         * 将本地文件名为src的文件上传到目标服务器，目标文件名为dst，若dst为目录，则目标文件名将与src文件名相同。
         *
         * 指定文件传输模式为mode（mode可选值为：ChannelSftp.OVERWRITE，ChannelSftp.RESUME，
         *
         * ChannelSftp.APPEND）
         *
         *
         * public void put(String src, String dst, SftpProgressMonitor monitor)
         *
         * 将本地文件名为src的文件上传到目标服务器，目标文件名为dst，若dst为目录，则目标文件名将与src文件名相同。
         *
         * 采用默认的传输模式：OVERWRITE
         *
         * 并使用实现了SftpProgressMonitor接口的monitor对象来监控文件传输的进度。
         *
         * public void put(String src, String dst, SftpProgressMonitor monitor,
         * int mode)
         *
         * 将本地文件名为src的文件上传到目标服务器，目标文件名为dst，若dst为目录，则目标文件名将与src文件名相同。
         *
         * 指定传输模式为mode
         *
         * 并使用实现了SftpProgressMonitor接口的monitor对象来监控文件传输的进度。
         *
         * public void put(InputStream src, String dst) 将本地的input
         * stream对象src上传到目标服务器，目标文件名为dst，dst不能为目录。
         *
         * 采用默认的传输模式：OVERWRITE
         *
         * public void put(InputStream src, String dst, int mode) 将本地的input
         * stream对象src上传到目标服务器，目标文件名为dst，dst不能为目录。
         *
         * 指定文件传输模式为mode
         *
         * public void put(InputStream src, String dst, SftpProgressMonitor
         * monitor)
         *
         * 将本地的input stream对象src上传到目标服务器，目标文件名为dst，dst不能为目录。
         *
         * 采用默认的传输模式：OVERWRITE
         *
         * 并使用实现了SftpProgressMonitor接口的monitor对象来监控传输的进度。
         *
         * public void put(InputStream src, String dst, SftpProgressMonitor
         * monitor, int mode)
         *
         * 将本地的input stream对象src上传到目标服务器，目标文件名为dst，dst不能为目录。
         *
         * 指定文件传输模式为mode
         *
         * 并使用实现了SftpProgressMonitor接口的monitor对象来监控传输的进度。
         *
         * public OutputStream put(String dst)
         * 该方法返回一个输出流，可以向该输出流中写入数据，最终将数据传输到目标服务器，目标文件名为dst，dst不能为目录。
         *
         * 采用默认的传输模式：OVERWRITE
         *
         * public OutputStream put(String dst, final int mode)
         * 该方法返回一个输出流，可以向该输出流中写入数据，最终将数据传输到目标服务器，目标文件名为dst，dst不能为目录。
         *
         * 指定文件传输模式为mode
         *
         * public OutputStream put(String dst, final SftpProgressMonitor
         * monitor, final int mode)
         * 该方法返回一个输出流，可以向该输出流中写入数据，最终将数据传输到目标服务器，目标文件名为dst，dst不能为目录。
         *
         * 指定文件传输模式为mode
         *
         * 并使用实现了SftpProgressMonitor接口的monitor对象来监控传输的进度。
         *
         * public OutputStream put(String dst, final SftpProgressMonitor
         * monitor, final int mode, long offset)
         * 该方法返回一个输出流，可以向该输出流中写入数据，最终将数据传输到目标服务器，目标文件名为dst，dst不能为目录。
         *
         * 指定文件传输模式为mode
         *
         * 并使用实现了SftpProgressMonitor接口的monitor对象来监控传输的进度。
         *
         * offset指定了一个偏移量，从输出流偏移offset开始写入数据。
         */
        /**
         * 注：请分别将代码段1，代码段2，代码段3取消注释，运行程序来进行测试。这三段代码分别演示了如何使用JSch的不同的put方法来进行文件上传。
         *
         * 代码段1：采用向put方法返回的输出流中写入数据的方式来传输文件。
         * 需要由程序来决定写入什么样的数据，这里是将本地文件的输入流写入输出流。采用这种方式的好处是，可以自行设定每次写入输出流的数据块大小，如本示例中的语句：
         *
         * byte[] buff = new byte[1024 * 256]; // 设定每次传输的数据块大小为256KB
         *
         *
         * 代码段2：直接将本地文件名为src的文件上传到目标服务器，目标文件名为dst。（注：使用这个方法时，dst可以是目录，当dst是目录时，上传后的目标文件名将与src文件名相同）
         *
         * 代码段3：将本地文件名为src的文件输入流上传到目标服务器，目标文件名为dst。
         *
         * 这三段代码实现的功能是一样的，都是将本地的文件src上传到了服务器的dst文件。使用时可根据具体情况选择使用哪种实现方式。
         */
    }
}
